/*
 * Copyright 2012-2021 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.web.server;

import java.time.Duration;
import java.time.temporal.ChronoUnit;

import org.springframework.boot.convert.DurationUnit;

/**
 * Cookie 属性配置类。
 *
 * @author Phillip Webb
 * @author Andy Wilkinson
 * @author Brian Clozel
 * @author Weix Sun
 * @since 2.6.0
 */
public class Cookie {

	/**
	 * Cookie 的名称。
	 */
	private String name;

	/**
	 * Cookie 的域名。
	 */
	private String domain;

	/**
	 * Cookie 的路径。
	 */
	private String path;

	/**
	 * 是否使用 HttpOnly 属性的 Cookie。
	 */
	private Boolean httpOnly;

	/**
	 * 是否总是将 Cookie 标记为安全（secure）。
	 */
	private Boolean secure;

	/**
	 * Cookie 的最大存活时间。如果没有指定时间单位后缀，则默认单位为秒。
	 * 正值表示相对于当前时间的过期时长。
	 * 0 表示立即过期。
	 * 负值表示不设置 "Max-Age" 属性。
	 */
	@DurationUnit(ChronoUnit.SECONDS)
	private Duration maxAge;

	/**
	 * Cookie 的 SameSite 策略设置。
	 */
	private SameSite sameSite;

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDomain() {
		return this.domain;
	}

	public void setDomain(String domain) {
		this.domain = domain;
	}

	public String getPath() {
		return this.path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public Boolean getHttpOnly() {
		return this.httpOnly;
	}

	public void setHttpOnly(Boolean httpOnly) {
		this.httpOnly = httpOnly;
	}

	public Boolean getSecure() {
		return this.secure;
	}

	public void setSecure(Boolean secure) {
		this.secure = secure;
	}

	public Duration getMaxAge() {
		return this.maxAge;
	}

	public void setMaxAge(Duration maxAge) {
		this.maxAge = maxAge;
	}

	public SameSite getSameSite() {
		return this.sameSite;
	}

	public void setSameSite(SameSite sameSite) {
		this.sameSite = sameSite;
	}

	/**
	 * SameSite 的取值枚举。
	 */
	public enum SameSite {

		/**
		 * Cookie 在第一方请求和跨域请求中都会发送。
		 */
		NONE("None"),

		/**
		 * Cookie 在第一方上下文中发送，也包括点击链接跳转到源站点时发送。
		 */
		LAX("Lax"),

		/**
		 * Cookie 仅在第一方上下文中发送（即不会在点击链接跳转到源站点时发送）。
		 */
		STRICT("Strict");

		private final String attributeValue;

		SameSite(String attributeValue) {
			this.attributeValue = attributeValue;
		}

		public String attributeValue() {
			return this.attributeValue;
		}

	}

}
